#include <assert.h>
#include <iostream>
#include "DMatrix.hpp"

DMatrix::DMatrix(const int row, const int col)
{
  mRowsize = row;
  mColsize = col;

  matrixPtr = new DArray*[mRowsize];

  for(int i=0; i<mRowsize; i++)
    matrixPtr[i] = new DArray(mColsize);
};

DMatrix::~DMatrix()
{
  for(int i=0; i<mRowsize; i++)
  {
    if( matrixPtr[i] != NULL )
      delete matrixPtr[i];
  }
  delete [] matrixPtr;
};

DArray& DMatrix::operator[](const int index)
{
  if( index >=mRowsize )
  {
    std::cerr<<"ERROR: index out of bounds []"<<std::endl;
    assert(0);
  }
  return *(matrixPtr[index]);
};

const DArray& DMatrix::operator[](const int index) const
{
  if(index >= mRowsize)
  {
    std::cerr<<"ERROR: index out of bounds []"<<std::endl;
    assert(0);
  }
  return *(matrixPtr[index]);
};



DMatrix& DMatrix::operator*=(const double rhs)
{
  for(int i=0; i<mRowsize; i++)
  {
    for(int j=0; j<mColsize; j++)
    {
      (*matrixPtr[i])[j] = rhs * (*matrixPtr[i])[j];
    }
  }
  return *this;
};

DMatrix& DMatrix::operator+=(const DMatrix& rhs)
{
  assert(rhs.rows()== mRowsize && rhs.cols()==mColsize);
  for(int i=0; i<mRowsize; i++)
    for(int j=0; j<mColsize; j++)
      (*matrixPtr[i])[j] = (*matrixPtr[i])[j] + rhs[i][j];
  return *this;
};


void DMatrix::print() const
{
  for(int i=0; i<mRowsize; i++)
  {
    for(int j=0; j<mColsize; j++)
    {
      std::cout<<(*matrixPtr[i])[j]<<'\t';
    }
    std::cout<<std::endl<<std::endl;
  }
};
